package top.v5it.japi.plus.data.jdbc.service;

import org.springframework.data.repository.CrudRepository;
import org.springframework.transaction.annotation.Transactional;

import java.util.Optional;

/**
 * @author zhanpu
 * @date 2022/8/3
 */
public interface JapiJdbcService<T, ID> {

    CrudRepository<T, ID> getJapiRepository();

    /**
     * 采用jdbc新增
     *
     * @param entity
     * @param <S>
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    default <S extends T> S add(S entity) {
        return getJapiRepository().save(entity);
    }

    /**
     * 采用jdbc新增所有
     *
     * @param entities
     * @param <S>
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    default <S extends T> Iterable<S> addAll(Iterable<S> entities) {
        return getJapiRepository().saveAll(entities);
    }

    /**
     * 采用jdbc按主键搜索
     *
     * @param id
     * @return
     */
    default Optional<T> searchById(ID id) {
        return getJapiRepository().findById(id);
    }

    /**
     * 采用jdbc按主键搜索是否存在，存在返回true，否则返回false
     *
     * @param id
     * @return
     */
    default boolean existsById(ID id) {
        return getJapiRepository().existsById(id);
    }

    /**
     * 采用jdbc搜索所有
     *
     * @return
     */
    default Iterable<T> searchAll() {
        return getJapiRepository().findAll();
    }

    /**
     * 采用jdbc按一批主键搜索
     *
     * @param ids
     * @return
     */
    default Iterable<T> searchAllById(Iterable<ID> ids) {
        return getJapiRepository().findAllById(ids);
    }

    /**
     * 采用jdbc统计所有
     *
     * @return
     */
    default long count() {
        return getJapiRepository().count();
    }

    /**
     * 采用jdbc按主键移除
     *
     * @param id
     */
    @Transactional(rollbackFor = Exception.class)
    default void removeById(ID id) {
        getJapiRepository().deleteById(id);
    }

    /**
     * 采用jdbc按实体移除
     *
     * @param entity
     */
    @Transactional(rollbackFor = Exception.class)
    default void remove(T entity) {
        getJapiRepository().delete(entity);
    }

    /**
     * 采用jdbc按一批实体移除
     *
     * @param entities
     */
    @Transactional(rollbackFor = Exception.class)
    default void removeAll(Iterable<? extends T> entities) {
        getJapiRepository().deleteAll(entities);
    }
}
